; ** por compatibilidad se omiten tildes **
; ==============================================================================
; TRABAJO PRACTICO 3 - System Programming - ORGANIZACION DE COMPUTADOR II - FCEN
; ==============================================================================
; KERNEL

BITS 16

%include "macrosmodoreal.mac"

%define KORG 0x1200

global start
extern tsss
extern gdt
extern GDT_DESC
extern IDT_DESC
extern inicializar_idt

extern resetear_pic
extern habilitar_pic

; PUNTO DE ENTRADA DEL KERNEL
start:
		cli ;pues que no me interrumpan por ahora
		jmp bienvenida

		;aca ponemos todos los mensajes
		iniciando: db 'Iniciando el kernel'
		iniciando_len equ $ - iniciando

bienvenida:
		IMPRIMIR_MODO_REAL iniciando, iniciando_len, 0x07, 0, 0

		; habilitar A20
		call checkear_A20
		call habilitar_A20
		call checkear_A20

		; dehsabilitar las interrupciones
		cli

		; cargar la GDT
		lgdt 	[GDT_DESC]

		; setear el bit PE del registro CR0
		mov 	eax, cr0
		or  	eax, 01h
		mov 	cr0, eax

		; pasar a modo protegido
		jmp 	0x50:modo_protegido

BITS 32
%include "macrosmodoprotegido.mac"
modo_protegido:

		; acomodar los segmentos
		mov 	ax, 0x58
		mov 	ds, ax		;acomodo el segmento de datos 
		mov 	es, ax		;acomodo el segmento de datos 
		mov 	gs, ax		;acomodo el segmento de datos 
		mov	ss, ax		;acomodo el segmento de pila antes de usarla
		mov 	ax, 0x70
		mov 	fs, ax		;acomodo el segmento de video en fs

		; seteo la pila
                mov esp, 0x20FFF        ;la pila esta vacia, apunto a la direccion mas alta.
		mov ebp, 0x20000	;apunto el ebp al final de la pila

		; pintar pantalla, todos los colores, que bonito!
		LIMPIAR_PANTALLA

		; inicializar la idt y manejo de interrupciones
		call inicializar_idt
		lidt[IDT_DESC] 	; cargamos el idtr

		; inicializar el manejador de memoria
		;VER		

		; inicializar el directorio de paginas
		call inicializar_dir_kernel
		; en eax me devuelve la base de mi directorio de Pagina

		;mov cr3, eax		; meto en cr3 la dir base del directorio que me acaban de pasar

		;mov eax, cr0		; voy a modificar el bit en cr0 para habilitar paginación
		;or eax, 0x80000000	; lno seteo en 1
		;mov cr0, eax		; y lo pongo en cr0
		jmp imprimir_nombre
		grupo: db "Diego Maradona"
		grupo_len equ $-grupo	
	imprimir_nombre:
		IMPRIMIR_TEXTO grupo, grupo_len, 0x0f, 0, 0
		jmp $

		; inicializar memoria de tareas

		; habilitar paginacion

		; inicializar tarea idle

		; inicializar todas las tsss

		; inicializar entradas de la gdt de tss

		; inicializar el scheduler

		; inicializar la IDT

		; configurar controlador de interrupciones

		; cargo la primer tarea null

		; aca salto a la primer tarea (Idle)

		jmp $

%include "a20.asm"








; ############################ FUNCIONES ############################ ;


inicializar_dir_kernel:

	mov ecx, 1024		; inicializo el contador
	mov eax, 0x21000 	; tengo la direccion donde va a empezar mi directorio, como dice el enunciado
	mov ebx, eax		; en eax tengo la base donde empieza el dir, la meto en ebx
	push eax		; guardo la base 

.pageDirectory:
	mov dword [ebx+ecx*4-4], 0x00000002	; pongo los ultimos bits en lo que corresponde
	loop .pageDirectory	 		; sino sigo a la proxima

	mov dword [0x21000], 0x22003		; en la primera entrada pongo la dir de la pt segun el enunciado y que esta presente

	mov ecx, 512		; recorrere las 1024 entradas de la pt
	mov ebx, 0x22000	; pongo en ebx la base de la pagina que me acaban de devolver
	mov edx, 0x00000003	; seteo los atributos en edx, luego voy a ir incrementado la direccion base de la pagina


.pageTable:
	mov [ebx+ecx*4],edx	; muevo el marco a la entrada de la pt
	add edx, 0x1000		; el proximo marco empieza 4kb mas "abajo"
	loop .pageTable

	pop eax		; en eax tengo la dir donde ta la base del dir
	ret	


; ########################### ! FUNCIONES ########################### ;

